(function($) {
	$.fn.slide = function(options) {
		$.fn.slide.deflunt = {
			effect : "fade", // 效果 || fade：渐显； || top：上滚动；|| left：左滚动；||
								// topLoop：上循环滚动；|| leftLoop：左循环滚动；||
								// topMarquee：上无缝循环滚动；|| leftMarquee：左无缝循环滚动；
			autoPlay : false, // 自动运行
			delayTime : 500, // 效果持续时间
			interTime : 2500,// 自动运行间隔。当effect为无缝滚动的时候，相当于运行速度。
			defaultIndex : 0,// 默认的当前位置索引。0是第一个
			titCell : ".hd li",// 导航元素
			mainCell : ".bd",// 内容元素的父层对象
			trigger : "mouseover",// 触发方式 || mouseover：鼠标移过触发；|| click：鼠标点击触发；
			scroll : 1,// 每次滚动个数。
			vis : 1,// visible，可视范围个数，当内容个数少于可视个数的时候，不执行效果。
			titOnClassName : "on",// 当前位置自动增加的class名称
			autoPage : false,// 系统自动分页，当为true时，titCell则为导航元素父层对象，同时系统会在titCell里面自动插入分页li元素(1.2版本新增)
			prevCell : ".prev",// 前一个按钮元素。
			nextCell : ".next"// 后一个按钮元素。
		};
		return this.each(function() {
			var opts = $.extend({}, $.fn.slide.deflunt, options);
			var index = opts.defaultIndex;
			var prevBtn = $(opts.prevCell, $(this));
			var nextBtn = $(opts.nextCell, $(this));
			var navObj = $(opts.titCell, $(this));// 导航子元素结合
			var navObjSize = navObj.size();
			var conBox = $(opts.mainCell, $(this));// 内容元素父层对象
			var conBoxSize = conBox.children().size();
			var slideH = 0;
			var slideW = 0;
			var selfW = 0;
			var selfH = 0;
			var autoPlay = opts.autoPlay;
			var inter = null;// setInterval名称
			var oldIndex = index;
			if (conBoxSize < opts.vis)
				return; // 当内容个数少于可视个数，不执行效果。
				// 处理分页
			if (navObjSize == 0)
				navObjSize = conBoxSize;
			if (opts.autoPage) {
				var tempS = conBoxSize - opts.vis;
				navObjSize = 1
						+ parseInt(tempS % opts.scroll != 0 ? (tempS
								/ opts.scroll + 1) : (tempS / opts.scroll));
				navObj.html("");
				for (var i = 0; i < navObjSize; i++) {
					navObj.append("<li>" + (i + 1) + "</li>")
				}
				var navObj = $("li", navObj);// 重置导航子元素对象
			}
			conBox.children().each(function() { // 取最大值
						if ($(this).width() > selfW) {
							selfW = $(this).width();
							slideW = $(this).outerWidth(true);
						}
						if ($(this).height() > selfH) {
							selfH = $(this).height();
							slideH = $(this).outerHeight(true);
						}
					});
			switch (opts.effect) {
				case "top" :
					conBox
							.wrap('<div class="tempWrap" style="overflow:hidden; position:relative; height:'
									+ opts.vis * slideH + 'px"></div>').css({
										"position" : "relative",
										"padding" : "0",
										"margin" : "0"
									}).children().css({
										"height" : "auto"
									});
					break;
				case "left" :
					conBox
							.wrap('<div class="tempWrap" style="overflow:hidden; position:relative; width:'
									+ opts.vis * slideW + 'px"></div>').css({
										"width" : conBoxSize * slideW,
										"position" : "relative",
										"overflow" : "hidden",
										"padding" : "0",
										"margin" : "0"
									}).children().css({
										"float" : "left",
										"width" : selfW
									});
					break;
				case "leftLoop" :
				case "leftMarquee" :
					conBox.children().clone().appendTo(conBox).clone()
							.prependTo(conBox);
					conBox
							.wrap('<div class="tempWrap" style="overflow:hidden; position:relative; width:'
									+ opts.vis * slideW + 'px"></div>').css({
										"width" : conBoxSize * slideW * 3,
										"position" : "relative",
										"overflow" : "hidden",
										"padding" : "0",
										"margin" : "0",
										"left" : -conBoxSize * slideW
									}).children().css({
										"float" : "left",
										"width" : selfW
									});
					break;
				case "topLoop" :
				case "topMarquee" :
					conBox.children().clone().appendTo(conBox).clone()
							.prependTo(conBox);
					conBox
							.wrap('<div class="tempWrap" style="overflow:hidden; position:relative; height:'
									+ opts.vis * slideH + 'px"></div>').css({
										"height" : conBoxSize * slideH * 3,
										"position" : "relative",
										"padding" : "0",
										"margin" : "0",
										"top" : -conBoxSize * slideH
									}).children().css({
										"height" : "auto"
									});
					break;
			}
			// 效果函数
			var doPlay = function() {
				switch (opts.effect) {
					case "fade" :
					case "top" :
					case "left" :
						if (index >= navObjSize) {
							index = 0;
						} else if (index < 0) {
							index = navObjSize - 1;
						}
						break;
					case "leftMarquee" :
					case "topMarquee" :
						if (index >= 2) {
							index = 1;
						} else if (index < 0) {
							index = 0;
						}
						break;
					case "leftLoop" :
					case "topLoop" :
						var tempNum = index - oldIndex;
						if (navObjSize > 2 && tempNum == -(navObjSize - 1))
							tempNum = 1;
						if (navObjSize > 2 && tempNum == (navObjSize - 1))
							tempNum = -1;
						var scrollNum = Math.abs(tempNum * opts.scroll);
						if (index >= navObjSize) {
							index = 0;
						} else if (index < 0) {
							index = navObjSize - 1;
						}
						break;
				}
				switch (opts.effect) {
					case "fade" :
						conBox.children().stop(true, true).eq(index)
								.fadeIn(opts.delayTime).siblings().hide();
						break;
					case "top" :
						conBox.stop(true, true).animate({
									"top" : -index * opts.scroll * slideH
								}, opts.delayTime);
						break;
					case "left" :
						conBox.stop(true, true).animate({
									"left" : -index * opts.scroll * slideW
								}, opts.delayTime);
						break;
					case "leftLoop" :
						if (tempNum < 0) {
							conBox.stop(true, true).animate({
										"left" : -(conBoxSize - scrollNum)
												* slideW
									}, opts.delayTime, function() {
										for (var i = 0; i < scrollNum; i++) {
											conBox.children().last()
													.prependTo(conBox);
										}
										conBox
												.css("left", -conBoxSize
																* slideW);
									});
						} else {
							conBox.stop(true, true).animate({
										"left" : -(conBoxSize + scrollNum)
												* slideW
									}, opts.delayTime, function() {
										for (var i = 0; i < scrollNum; i++) {
											conBox.children().first()
													.appendTo(conBox);
										}
										conBox
												.css("left", -conBoxSize
																* slideW);
									});
						}
						break;// leftLoop end
					case "topLoop" :
						if (tempNum < 0) {
							conBox.stop(true, true).animate({
										"top" : -(conBoxSize - scrollNum)
												* slideH
									}, opts.delayTime, function() {
										for (var i = 0; i < scrollNum; i++) {
											conBox.children().last()
													.prependTo(conBox);
										}
										conBox.css("top", -conBoxSize * slideH);
									});
						} else {
							conBox.stop(true, true).animate({
										"top" : -(conBoxSize + scrollNum)
												* slideH
									}, opts.delayTime, function() {
										for (var i = 0; i < scrollNum; i++) {
											conBox.children().first()
													.appendTo(conBox);
										}
										conBox.css("top", -conBoxSize * slideH);
									});
						}
						break;// topLoop end
					case "leftMarquee" :
						var tempLeft = conBox.css("left").replace("px", "");
						if (index == 0) {
							conBox.animate({
										"left" : ++tempLeft
									}, 0, function() {
										if (conBox.css("left")
												.replace("px", "") >= 0) {
											for (var i = 0; i < conBoxSize; i++) {
												conBox.children().last()
														.prependTo(conBox);
											}
											conBox.css("left", -conBoxSize
															* slideW);
										}
									});
						} else {
							conBox.animate({
										"left" : --tempLeft
									}, 0, function() {
										if (conBox.css("left")
												.replace("px", "") <= -conBoxSize
												* slideW * 2) {
											for (var i = 0; i < conBoxSize; i++) {
												conBox.children().first()
														.appendTo(conBox);
											}
											conBox.css("left", -conBoxSize
															* slideW);
										}
									});
						}
						break;// leftMarquee end
					case "topMarquee" :
						var tempTop = conBox.css("top").replace("px", "");
						if (index == 0) {
							conBox.animate({
										"top" : ++tempTop
									}, 0, function() {
										if (conBox.css("top").replace("px", "") >= 0) {
											for (var i = 0; i < conBoxSize; i++) {
												conBox.children().last()
														.prependTo(conBox);
											}
											conBox.css("top", -conBoxSize
															* slideH);
										}
									});
						} else {
							conBox.animate({
										"top" : --tempTop
									}, 0, function() {
										if (conBox.css("top").replace("px", "") <= -conBoxSize
												* slideH * 2) {
											for (var i = 0; i < conBoxSize; i++) {
												conBox.children().first()
														.appendTo(conBox);
											}
											conBox.css("top", -conBoxSize
															* slideH);
										}
									});
						}
						break;// topMarquee end
				}// switch end
				navObj.removeClass(opts.titOnClassName).eq(index)
						.addClass(opts.titOnClassName);
				oldIndex = index;
			};
			// 初始化执行
			doPlay();
			// 自动播放
			if (autoPlay) {
				if (opts.effect == "leftMarquee" || opts.effect == "topMarquee") {
					index++;
					inter = setInterval(doPlay, opts.interTime);
					conBox.hover(function() {
								if (autoPlay) {
									clearInterval(inter);
								}
							}, function() {
								if (autoPlay) {
									clearInterval(inter);
									inter = setInterval(doPlay, opts.interTime);
								}
							});
				} else {
					inter = setInterval(function() {
								index++;
								doPlay()
							}, opts.interTime);
					$(this).hover(function() {
								if (autoPlay) {
									clearInterval(inter);
								}
							}, function() {
								if (autoPlay) {
									clearInterval(inter);
									inter = setInterval(function() {
												index++;
												doPlay()
											}, opts.interTime);
								}
							});
				}
			}
			// 鼠标事件
			var mst;
			if (opts.trigger == "mouseover") {
				navObj.hover(function() {
							clearTimeout(mst);
							index = navObj.index(this);
							mst = window.setTimeout(doPlay, 200);
						}, function() {
							if (!mst)
								clearTimeout(mst);
						});
			} else {
				navObj.click(function() {
							index = navObj.index(this);
							doPlay();
						})
			}
			nextBtn.click(function() {
						index++;
						doPlay();
					});
			prevBtn.click(function() {
						index--;
						doPlay();
					});
		});// each End
	};// slide End
})(jQuery);
